home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1999 Spring / macformat-077.iso / Shareware Plus / Development / SpriteWorld 2.2 Extra Demos / Large Background Scrolling / Large Background.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-01-25  |  13.7 KB  |  551 lines  |  [TEXT/CWIE]

  1. ///--------------------------------------------------------------------------------------
  2. // Large Background.c
  3. //
  4. // By Vern Jensen, August 1995
  5. ///--------------------------------------------------------------------------------------
  6.  
  7.  
  8. #include <SWFPSReport.h>
  9. #include <SWIncludes.h>
  10. #include <SWGameUtils.h>
  11.  
  12. #include "SWApplication.h"
  13. #include "Large Background.h"
  14.  
  15. #define kCreateMouseSprite            true        // keeps mouse from disappearing
  16. #define kShieldCursor                false        // hides the real mouse when over window
  17. #define kUseCopyBits                false        // uses CopyBits as ScreenDrawProc
  18.  
  19. #define kDoubleSize                    true        // doubles size of offscreen area
  20. #define kInterlacedMode                false        // turns Interlaced mode on/off
  21. #define kSyncToVBL                    false        // sync SpriteWorld to VBL?
  22. #define kWorldRectInset                0            // make SpriteWorld smaller than window
  23. #define kMaxFPS                        30            // set to 0 for unrestricted speed
  24.  
  25. #define    kNumSprites                    30            // total number of sprites
  26. #define    kMaxSpriteMoveDelta            10            // maximum speed of the sprites
  27.  
  28. #define kEscKey                        0x35        // optional way to end demo
  29.  
  30.  
  31.  
  32. /***********/
  33. /* Globals */
  34. /***********/
  35.  
  36. SpriteWorldPtr    gSpriteWorldP;
  37. SpriteLayerPtr    ballSpriteLayerP;
  38. SpriteLayerPtr    mouseSpriteLayerP;
  39. SpritePtr        gSpriteArray[kNumSprites];
  40. SpritePtr        gMouseSpriteP;
  41. DrawProcPtr        gSpriteDrawProc = SWStdSpriteDrawProc;
  42. DrawProcPtr        gScreenDrawProc = SWStdWorldDrawProc;
  43. Rect            gOffscreenRect;
  44. PicHandle        gBackPictH;
  45. WindowPtr        gWindowP;
  46. Boolean            gDone;
  47.     
  48.  
  49. ///--------------------------------------------------------------------------------------
  50. // Main
  51. ///--------------------------------------------------------------------------------------
  52.  
  53. void    main( void )
  54. {
  55.     Initialize(kNumberOfMoreMastersCalls);
  56.     
  57.     if (SWHasSystem7())
  58.     {
  59.         AllowKeyUpEvents();
  60.         SetCursor(*GetCursor(watchCursor));
  61.         
  62.         CreateSpriteWorld();
  63.         CreateBallSprites();
  64.         
  65.         if (kCreateMouseSprite)
  66.             CreateMouseSprite();
  67.         
  68.         SetUpAnimation();
  69.         RunAnimation();
  70.         ShutDown();
  71.         
  72.         RestoreEventMask();
  73.     }
  74.     else
  75.     {
  76.         CantRunOnThisMachine();
  77.     }
  78. }
  79.  
  80.  
  81. ///--------------------------------------------------------------------------------------
  82. // CreateSpriteWorld
  83. ///--------------------------------------------------------------------------------------
  84.  
  85. void    CreateSpriteWorld( void )
  86. {
  87.     RgnHandle    mBarUpdateRgn;
  88.     Rect        windRect, worldRect;
  89.     OSErr        err;
  90.     
  91.     gWindowP = GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
  92.     
  93.     if (gWindowP != NULL)
  94.     {
  95.             // Center window in screen
  96.         windRect = gWindowP->portRect;
  97.         CenterRect(&windRect, &qd.screenBits.bounds);
  98.         MoveWindow(gWindowP, windRect.left, windRect.top, false);
  99.         
  100.         ShowWindow(gWindowP);
  101.         SetPort(gWindowP);
  102.         mBarUpdateRgn = SWHideMenuBar(gWindowP); // Must be done *after* showing window!
  103.         EraseRgn(mBarUpdateRgn);
  104.         
  105.         if (kInterlacedMode)
  106.             PaintRect(&gWindowP->portRect);    // Black out window for Interlaced mode
  107.     }
  108.     else
  109.         CantFindResource();
  110.     
  111.     
  112.     err = SWEnterSpriteWorld();
  113.     FatalError(err);
  114.     
  115.     
  116.     if ( GetDepthFromWindow(gWindowP) <= 2 )
  117.         gBackPictH = GetPicture(129);    // B&W pict
  118.     else
  119.         gBackPictH = GetPicture(128);    // Color pict
  120.  
  121.     if (gBackPictH == nil)
  122.     {
  123.         SysBeep( 10 );
  124.         ExitToShell();
  125.     }
  126.     
  127.     gOffscreenRect = (**(gBackPictH)).picFrame;
  128.     
  129.     if (kDoubleSize)
  130.     {
  131.         gOffscreenRect.right *= 2;
  132.         gOffscreenRect.bottom *= 2;
  133.     }
  134.     
  135.     
  136.     worldRect = gWindowP->portRect;
  137.     InsetRect(&worldRect, kWorldRectInset, kWorldRectInset);
  138.     
  139.     
  140.         // Create the SpriteWorld
  141.     err = SWCreateSpriteWorldFromWindow(&gSpriteWorldP, (CWindowPtr)gWindowP, 
  142.             &worldRect, &gOffscreenRect, 0);
  143.     FatalError(err);
  144.     
  145.         
  146.         // Create the sprite layers
  147.     err = SWCreateSpriteLayer(&ballSpriteLayerP);
  148.     FatalError(err);
  149.     err = SWCreateSpriteLayer(&mouseSpriteLayerP);
  150.     FatalError(err);
  151.     
  152.         // add the layers to the world
  153.     SWAddSpriteLayer(gSpriteWorldP, ballSpriteLayerP);        // Bottom layer
  154.     SWAddSpriteLayer(gSpriteWorldP, mouseSpriteLayerP);        // Top layer
  155.  
  156.     
  157.         // Determine what DrawProcs to use
  158.     if (gSpriteWorldP->pixelDepth == 8)        // 256 colors
  159.     {
  160.         if (kInterlacedMode)
  161.         {
  162.             gSpriteDrawProc = BP8BitInterlacedMaskDrawProc;
  163.             gScreenDrawProc = BP8BitInterlacedRectDrawProc;
  164.         }
  165.         else
  166.         {
  167.             gSpriteDrawProc = CompiledSprite8BitDrawProc;
  168.             gScreenDrawProc = BlitPixie8BitRectDrawProc;
  169.         }
  170.     }
  171.     else                                    // Not 256 colors
  172.     {
  173.             // Use interlaced drawProcs unless in B&W, where interlacing is ugly
  174.         if (kInterlacedMode && gSpriteWorldP->pixelDepth > 2)
  175.         {
  176.             gSpriteDrawProc = BPAllBitInterlacedMaskDrawProc;
  177.             gScreenDrawProc = BPAllBitInterlacedRectDrawProc;
  178.             
  179.         }
  180.         else if (!(SW_PPC && gSpriteWorldP->pixelDepth < 8) )    // AllBit works on PPC only
  181.         {                                                        // in 8-bits or above.
  182.             gSpriteDrawProc = BlitPixieAllBitMaskDrawProc;
  183.             gScreenDrawProc = BlitPixieAllBitRectDrawProc;
  184.         }
  185.     }
  186. }
  187.     
  188.     
  189. ///--------------------------------------------------------------------------------------
  190. // CreateBallSprites
  191. ///--------------------------------------------------------------------------------------
  192.  
  193. void    CreateBallSprites( void )
  194. {
  195.     SpritePtr            simpleSpriteP;
  196.     short                spriteNum;
  197.     OSErr                err;
  198.     
  199.         // Create the first sprite
  200.     err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &gSpriteArray[0], NULL, 
  201.             128, 1, kFatMask);    
  202.     FatalError(err);
  203.     
  204.     if (gSpriteWorldP->pixelDepth == 8)
  205.         SWCompileSprite(gSpriteArray[0]);
  206.     
  207.         // clone the rest of the sprites off the first one
  208.     for (spriteNum = 1; spriteNum < kNumSprites; spriteNum++)
  209.     {
  210.         err = SWCloneSprite(gSpriteArray[0], &gSpriteArray[spriteNum], NULL);
  211.         FatalError(err);
  212.     }
  213.     
  214.     
  215.         // Set up the sprites in random locations with random deltas
  216.     for (spriteNum = 0; spriteNum < kNumSprites; spriteNum++)
  217.     {
  218.         simpleSpriteP = gSpriteArray[spriteNum];
  219.  
  220.         SWAddSprite(ballSpriteLayerP, simpleSpriteP);
  221.         SWSetSpriteMoveBounds(simpleSpriteP, &gOffscreenRect);
  222.         SWSetSpriteMoveProc(simpleSpriteP, BallSpriteMoveProc);
  223.         SWSetSpriteDrawProc(simpleSpriteP, gSpriteDrawProc);
  224.         
  225.         SWSetSpriteLocation(simpleSpriteP, 
  226.                 GetRandom(0, gOffscreenRect.right), 
  227.                 GetRandom(0, gOffscreenRect.bottom) );
  228.         
  229.         SWSetSpriteMoveDelta(simpleSpriteP, 
  230.                 GetRandom(-kMaxSpriteMoveDelta, kMaxSpriteMoveDelta), 
  231.                 GetRandom(-kMaxSpriteMoveDelta, kMaxSpriteMoveDelta));
  232.     }
  233. }
  234.  
  235.  
  236. ///--------------------------------------------------------------------------------------
  237. // CreateMouseSprite
  238. ///--------------------------------------------------------------------------------------
  239.  
  240. void    CreateMouseSprite( void )
  241. {
  242.     OSErr                err;
  243.     
  244.         // Create the mouse sprite
  245.     err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &gMouseSpriteP, NULL, 
  246.             129, 1, kPixelMask);    
  247.     FatalError(err);
  248.  
  249.     if (gSpriteWorldP->pixelDepth == 8)
  250.         SWCompileSprite(gMouseSpriteP);
  251.     
  252.     SWAddSprite(mouseSpriteLayerP, gMouseSpriteP);
  253.     SWSetSpriteDrawProc(gMouseSpriteP, gSpriteDrawProc);
  254. }
  255.  
  256.  
  257. ///--------------------------------------------------------------------------------------
  258. // SetUpAnimation
  259. ///--------------------------------------------------------------------------------------
  260.  
  261. void    SetUpAnimation( void )
  262. {
  263.     SWLockSpriteWorld(gSpriteWorldP);
  264.     
  265.     if (!kUseCopyBits)    // Only set DrawProc to blitter if CopyBits is not to be used
  266.         SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, gScreenDrawProc);
  267.     
  268.     SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, gScreenDrawProc);
  269.     SWSetSpriteWorldMaxFPS(gSpriteWorldP, kMaxFPS);
  270.     SWSyncSpriteWorldToVBL(gSpriteWorldP, kSyncToVBL);
  271.     SWSetCleanUpSpriteWorld(gSpriteWorldP);
  272.     SWSetScrollingWorldMoveBounds(gSpriteWorldP, &gSpriteWorldP->backRect);
  273.     
  274.     ForeColor(blackColor);
  275.     BackColor(whiteColor);
  276.     
  277.         // Draw background
  278.     SWSetPortToBackground(gSpriteWorldP);
  279.     DrawPicture(gBackPictH, &gOffscreenRect);
  280.     
  281.     SetCursor(&qd.arrow);
  282.     ShieldMyCursor();
  283.     
  284.     SWUpdateScrollingSpriteWorld(gSpriteWorldP, true);
  285. }
  286.  
  287.  
  288. ///--------------------------------------------------------------------------------------
  289. //  ShieldMyCursor
  290. ///--------------------------------------------------------------------------------------
  291.  
  292. void    ShieldMyCursor( void )
  293. {
  294.     Rect    shieldRect;
  295.     Point    globalOffset;
  296.     Point    blankPoint;
  297.     
  298.     if (kShieldCursor)
  299.     {
  300.         SWSetPortToWindow(gSpriteWorldP);
  301.  
  302.         SetPt(&globalOffset, 0, 0);
  303.         LocalToGlobal(&globalOffset);
  304.         
  305.         SetPt(&blankPoint, 0, 0);
  306.         
  307.         shieldRect = gSpriteWorldP->windRect;
  308.  
  309.         OffsetRect(&shieldRect, globalOffset.h, globalOffset.v);
  310.         InsetRect(&shieldRect, 16, 16);
  311.         ShieldCursor(&shieldRect, blankPoint);
  312.     }
  313. }
  314.  
  315.  
  316. ///--------------------------------------------------------------------------------------
  317. //  RunAnimation
  318. ///--------------------------------------------------------------------------------------
  319.  
  320. void    RunAnimation( void )
  321. {
  322.     EventRecord event;
  323.  
  324.     FatalError( SWStickyError() ); // Make sure no errors got past us during setup
  325.  
  326.     while (!gDone)
  327.     {
  328.         if ( WaitNextEvent(everyEvent, &event, 0L, NULL) )
  329.             DispatchEvent(&event);
  330.         
  331.             // Make sure window wasn't "rolled up" with WindowShade
  332.         if ( !EmptyRgn( gWindowP->visRgn ) )
  333.         {
  334.             SWProcessScrollingSpriteWorld(gSpriteWorldP);
  335.             
  336.                 // Call the MouseSpriteMoveProc directly, so
  337.                 // it has the latest visScrollRect position
  338.             if (kCreateMouseSprite)
  339.                 MouseSpriteMoveProc(gMouseSpriteP);
  340.             
  341.             FatalError( SWStickyError() ); // Make sure no errors occurred in a MoveProc, etc
  342.                 
  343.             SWAnimateScrollingSpriteWorld(gSpriteWorldP);
  344.         }
  345.     }
  346.     
  347.     SWShowMenuBar(gWindowP);
  348. }
  349.  
  350. ///--------------------------------------------------------------------------------------
  351. //  DispatchEvent
  352. ///--------------------------------------------------------------------------------------
  353.  
  354. void DispatchEvent(EventRecord* event)
  355. {
  356.     short            theKey, theChar;    
  357.     Boolean            isDown;
  358.     
  359.     switch(event->what)
  360.     {
  361.         case mouseDown:
  362.             HandleMouseDown( event );
  363.             break;
  364.         case mouseUp:
  365.             break;
  366.         case keyUp:
  367.             break;
  368.         case keyDown:
  369.         case autoKey:
  370.             theKey = (event->message & keyCodeMask) >> 8;
  371.             theChar = event->message & charCodeMask;
  372.             isDown = (event->what != keyUp);
  373.             
  374.             if ( (theKey == kEscKey) || (theChar == 'Q') || (theChar == 'q') )
  375.                 gDone = true;
  376.             break;
  377.         case updateEvt:
  378.             break;
  379.         case diskEvt:
  380.             break;
  381.         case activateEvt:
  382.             break;
  383.         case networkEvt:
  384.             break;
  385.         case driverEvt:
  386.             break;
  387.         case app1Evt:
  388.             break;
  389.         case app2Evt:
  390.             break;
  391.         case app3Evt:
  392.             break;
  393.         case osEvt:
  394.             if ( ( event->message & suspendResumeMessage ) == resumeFlag )
  395.             {
  396.                 ShieldMyCursor();
  397.                 SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, gScreenDrawProc);
  398.             }
  399.             else
  400.             {
  401.                 ShowCursor();
  402.                 SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, SWStdWorldDrawProc);
  403.             }
  404.             break;
  405.         case kHighLevelEvent:
  406.             break;
  407.         default:
  408.         break;
  409.     }
  410. }
  411.  
  412.  
  413. ///--------------------------------------------------------------------------------------
  414. //  HandleMouseDown
  415. ///--------------------------------------------------------------------------------------
  416.  
  417. void    HandleMouseDown( EventRecord *eventPtr )
  418. {
  419.     WindowPtr        theWindow;
  420.     short            thePart;
  421.     Point            thePoint;
  422.     long            menuChoice;
  423.     
  424.     
  425.     thePoint = eventPtr->where;
  426.     thePart = FindWindow( thePoint, &theWindow );
  427.  
  428.     switch ( thePart )
  429.     {
  430.         case inSysWindow : 
  431.             SystemClick( eventPtr, theWindow );
  432.             break;
  433.         case inDrag:
  434.             ShowCursor();
  435.             DragWindow( theWindow, thePoint, &((**(GetGrayRgn())).rgnBBox) );
  436.             ShieldMyCursor();
  437.             SWWindowMoved( gSpriteWorldP );
  438.             break;
  439.         case inZoomOut:
  440.         case inZoomIn:
  441.             break;
  442.         case inMenuBar:
  443.             break;
  444.         case inGoAway:
  445.             if ( TrackGoAway(theWindow, thePoint) )
  446.                 gDone = true;
  447.             break;
  448.         case inGrow:
  449.             break;
  450.         case inContent:
  451.             DragMouseInWindow(eventPtr);
  452.             break;
  453.     }
  454. }
  455.  
  456.  
  457. ///--------------------------------------------------------------------------------------
  458. //  ShutDown (clean up and dispose of the SpriteWorld)
  459. ///--------------------------------------------------------------------------------------
  460.  
  461. void    ShutDown( void )
  462. {
  463.     SWUnlockSpriteWorld(gSpriteWorldP);
  464.     SWDisposeSpriteWorld(&gSpriteWorldP);
  465.     SWExitSpriteWorld();
  466.     
  467.     FlushEvents(everyEvent, 0);
  468.     ShowCursor();
  469. }
  470.  
  471.  
  472. ///--------------------------------------------------------------------------------------
  473. //  BallSpriteMoveProc
  474. ///--------------------------------------------------------------------------------------
  475.  
  476.  
  477. SW_FUNC void    BallSpriteMoveProc(SpritePtr ballSpriteP)
  478. {    
  479.     SWOffsetSprite(ballSpriteP, ballSpriteP->horizMoveDelta, ballSpriteP->vertMoveDelta);
  480.     
  481. //    SWBounceSprite(ballSpriteP);
  482.     SWWrapSprite(ballSpriteP);
  483. }
  484.  
  485.  
  486. ///--------------------------------------------------------------------------------------
  487. //  MouseSpriteMoveProc
  488. ///--------------------------------------------------------------------------------------
  489.  
  490. SW_FUNC void MouseSpriteMoveProc(SpritePtr srcSpriteP)
  491. {
  492.     Point                mousePoint;
  493.     SpritePtr            tempSpriteP;
  494.     EventRecord            event;
  495.     short                theChar;
  496.     
  497.         // Get mouse coordinates local to the window
  498.     SetPort(gWindowP);
  499.     GetMouse(&mousePoint);
  500.     
  501.         // Subtract any offset from worldRect to window if a worldRect is used
  502.     mousePoint.h -= gSpriteWorldP->windRect.left;
  503.     mousePoint.v -= gSpriteWorldP->windRect.top;
  504.     
  505.     SWMoveSprite(srcSpriteP, 
  506.         mousePoint.h - 1 + gSpriteWorldP->visScrollRect.left, 
  507.         mousePoint.v - 1 + gSpriteWorldP->visScrollRect.top);
  508. }
  509.  
  510.  
  511. ///--------------------------------------------------------------------------------------
  512. //  DragMouseInWindow
  513. ///--------------------------------------------------------------------------------------
  514.  
  515. SW_FUNC void DragMouseInWindow(EventRecord *eventPtr)
  516. {
  517.     Point    mousePoint, oldPoint;
  518.     Rect    oldVisScrollRect, destRect;
  519.     
  520.     oldPoint = eventPtr->where;
  521.     oldVisScrollRect = gSpriteWorldP->visScrollRect;
  522.     
  523.     do
  524.     {
  525.         GetMouse(&mousePoint);
  526.         LocalToGlobal(&mousePoint);
  527.         
  528.         destRect = oldVisScrollRect;
  529.         OffsetRect(&destRect, oldPoint.h - mousePoint.h, oldPoint.v - mousePoint.v);
  530.         
  531.         if (kInterlacedMode)
  532.         {
  533.             if (destRect.top & 1)
  534.                 OffsetRect(&destRect, 0, 1);
  535.         }
  536.         
  537.         
  538.         SWMoveVisScrollRect(gSpriteWorldP, destRect.left, destRect.top);
  539.         
  540.             // Process a frame of the animation
  541.         SWProcessScrollingSpriteWorld(gSpriteWorldP);
  542.         
  543.         if (kCreateMouseSprite)
  544.             MouseSpriteMoveProc(gMouseSpriteP);
  545.             
  546.         SWAnimateScrollingSpriteWorld(gSpriteWorldP);
  547.     }
  548.     while (StillDown());
  549. }
  550.  
  551.